package com.ruoyi.operation.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.operation.domain.TGentaskList;
import com.ruoyi.operation.domain.bo.DailyTaskBo;
import com.ruoyi.operation.domain.bo.TItdutytaskBo;
import com.ruoyi.operation.domain.vo.DailyTaskVo;
import com.ruoyi.operation.domain.vo.TItdutytaskVo;
import com.ruoyi.operation.service.ITItdutytaskService;
import com.ruoyi.system.api.RemoteTBsCalendarService;
import com.ruoyi.system.api.domain.TBsCalendar;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Service;
import com.ruoyi.operation.domain.bo.TItdutytaskListBo;
import com.ruoyi.operation.domain.vo.TItdutytaskListVo;
import com.ruoyi.operation.domain.TItdutytaskList;
import com.ruoyi.operation.mapper.TItdutytaskListMapper;
import com.ruoyi.operation.service.ITItdutytaskListService;

import java.util.*;

/**
 * 生成的任务流水Service业务层处理
 *
 * @author chq
 * @date 2025-07-04
 */
@RequiredArgsConstructor
@Service
public class TItdutytaskListServiceImpl implements ITItdutytaskListService {

    private final TItdutytaskListMapper baseMapper;

    private final ITItdutytaskService itdutytaskService;

    @DubboReference
    private RemoteTBsCalendarService remoteTBsCalendarService;

    /**
     * 查询生成的任务流水
     */
    @Override
    public TItdutytaskListVo queryById(String id){
        return baseMapper.selectVoById(id);
    }

    /**
     * 查询生成的任务流水列表
     */
    @Override
    public TableDataInfo<TItdutytaskListVo> queryPageList(TItdutytaskListBo bo, PageQuery pageQuery) {
        LambdaQueryWrapper<TItdutytaskList> lqw = buildQueryWrapper(bo);
        Page<TItdutytaskListVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
        return TableDataInfo.build(result);
    }

    /**
     * 查询生成的任务流水列表
     */
    @Override
    public List<TItdutytaskListVo> queryList(TItdutytaskListBo bo) {
        LambdaQueryWrapper<TItdutytaskList> lqw = buildQueryWrapper(bo);
        return baseMapper.selectVoList(lqw);
    }

    private LambdaQueryWrapper<TItdutytaskList> buildQueryWrapper(TItdutytaskListBo bo) {
        Map<String, Object> params = bo.getParams();
        LambdaQueryWrapper<TItdutytaskList> lqw = Wrappers.lambdaQuery();
        lqw.eq(StringUtils.isNotBlank(bo.getItdutytaskid()), TItdutytaskList::getItdutytaskid, bo.getItdutytaskid());
        lqw.eq(StringUtils.isNotBlank(bo.getTaskdate()), TItdutytaskList::getTaskdate, bo.getTaskdate());
        lqw.eq(StringUtils.isNotBlank(bo.getTaskstatus()), TItdutytaskList::getTaskstatus, bo.getTaskstatus());
        lqw.eq(StringUtils.isNotBlank(bo.getResultvalue()), TItdutytaskList::getResultvalue, bo.getResultvalue());
        return lqw;
    }

    /**
     * 新增生成的任务流水
     */
    @Override
    public Boolean insertByBo(TItdutytaskListBo bo) {
        TItdutytaskList add = BeanUtil.toBean(bo, TItdutytaskList.class);
        validEntityBeforeSave(add);
        boolean flag = baseMapper.insert(add) > 0;
        if (flag) {
            bo.setId(add.getId());
        }
        return flag;
    }

    /**
     * 修改生成的任务流水
     */
    @Override
    public Boolean updateByBo(TItdutytaskListBo bo) {
        TItdutytaskList update = BeanUtil.toBean(bo, TItdutytaskList.class);
        validEntityBeforeSave(update);
        return baseMapper.updateById(update) > 0;
    }

    /**
     * 保存前的数据校验
     */
    private void validEntityBeforeSave(TItdutytaskList entity){
        //TODO 做一些数据校验,如唯一约束
    }

    /**
     * 批量删除生成的任务流水
     */
    @Override
    public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
        if(isValid){
            //TODO 做一些业务上的校验,判断是否需要校验
        }
        return baseMapper.deleteBatchIds(ids) > 0;
    }

    @Override
    public TableDataInfo<TItdutytaskListVo> initDaytask(String dateEight) {
        TBsCalendar tBsCalendar = remoteTBsCalendarService.selectTBsCalendarByNatureday(dateEight);
        //删除当日全量数据首先
        QueryWrapper<TItdutytaskList> wrapper = new QueryWrapper<>();
        wrapper.eq("taskdate", dateEight);
        baseMapper.delete(wrapper);

        //将维护D日的情况，无条件增加进去
        TItdutytaskBo bo = new TItdutytaskBo();
        bo.setFlag("1");
        bo.setPeriod("D");
        List<TItdutytaskVo> tItdutytaskVos = Optional.ofNullable(itdutytaskService.queryList(bo)).orElse(new ArrayList<TItdutytaskVo>());
        //将维护dateRight的情况,无条件增加进去,这个情况是具体的某一天需要执行的一个任务
        bo.setPeriod(dateEight);
        tItdutytaskVos.addAll(itdutytaskService.queryList(bo));
        //将维护T的情况，如果是工作日，则维护进去
        if ("0".equals(tBsCalendar.getDealflag())) {    //0工作日
            bo.setPeriod("T");
            tItdutytaskVos.addAll(itdutytaskService.queryList(bo));
        }
        //将维护C既是香港工作日又是内地工作日情况，如果是，则维护进去
        if ("0".equals(tBsCalendar.getHkdealflag()) && "0".equals(tBsCalendar.getDealflag())) {  //0香港工作日
            bo.setPeriod("C");
            tItdutytaskVos.addAll(itdutytaskService.queryList(bo));
        }
        //其他枚举类型，是后续再新增

        //将结果轮询后插入到List流水表
        for (TItdutytaskVo vo : tItdutytaskVos) {
            TItdutytaskList tItdutytaskList = new TItdutytaskList();
            tItdutytaskList.setItdutytaskid(vo.getId());
            tItdutytaskList.setTaskdate(dateEight);
            tItdutytaskList.setTaskstatus("0");
            baseMapper.insert(tItdutytaskList);
        }

        TItdutytaskListBo itdutytaskListBo = new TItdutytaskListBo();
        itdutytaskListBo.setTaskdate(dateEight);
        PageQuery pageQuery = new PageQuery();
        pageQuery.setPageSize(800);
        return queryPageList(itdutytaskListBo, pageQuery);
    }

    @Override
    public List<DailyTaskVo> dailyDutytask(DailyTaskBo bo) {
        return baseMapper.queryDailyTask(bo);
    }
}
